package com.dmg.config;

import com.dmg.entity.PeiZhi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 自定义动态数据源 必须继承 抽象路由数据源 这个类
 * AbstractRoutingDataSource 用于动态切换数据源
 */
@Slf4j
public class MyDataSource extends AbstractRoutingDataSource {

    /**
     * 根据key来获取是那个数据源下的
     * @return
     */
    @Override
    protected Object determineCurrentLookupKey() {
        log.info("进入自定义动态数据源分片方法,根据租户id,动态切换数据源");
        return DataSourceContextHolder.getDataSourceKey();
    }

    //重新初始化数据源
    @Override
    public void afterPropertiesSet() {
        log.info("重新初始化数据源");
        super.afterPropertiesSet();
    }

    /**
     * 添加数据库配置的数据源,并且进行初始化
     * @param list
     */
    public void addPeiZhiList(List<PeiZhi> list){
        log.info("添加数据库配置的数据源,并且进行初始化");
        Map<Object, Object> targetDataSources = new HashMap<>();
        for (PeiZhi x : list) {
            DriverManagerDataSource ds = new DriverManagerDataSource();
            ds.setUrl(x.getUrl());
            ds.setUsername(x.getUserName());
            ds.setPassword(x.getPassword());
            //ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
            //租户id 当做key  value:就是对应租户的数据源对象
            targetDataSources.put(x.getTenantId(), ds);
        }
        //调用父类方法 设置目标数据源 把多个数据源放入到 resolvedDefaultDataSource 中
        //这一步还没有生效，在下面的afterPropertiesSet()方法中会把数据源放入resolvedDefaultDataSource中
        setTargetDataSources(targetDataSources);
        //注意：在这里不需要设置默认数据源，因为在进行数据源配置的时候，已经设置了默认的主库的数据源
        //重新初始化数据源,把新的数据源放入到ioc容器中,这一步很重要
        afterPropertiesSet();
    }
}